package com.zjsru.plan2024.codeBase.fifty;

/**
 * 28. 找出字符串中第一个匹配项的下标
 * @Author: cookLee
 * @Date: 2024-06-23
 */
public class StrStr {

    /**
     * 主
     * \
     * 输入：haystack = "sadbutsad", needle = "sad"
     * 输出：0
     * 解释："sad" 在下标 0 和 6 处匹配。
     * 第一个匹配项的下标是 0 ，所以返回 0 。
     * \
     * 输入：haystack = "leetcode", needle = "leeto"
     * 输出：-1
     * 解释："leeto" 没有在 "leetcode" 中出现，所以返回 -1 。
     * \
     * @param args args
     */
    public static void main(String[] args) {
        StrStr strStr = new StrStr();
        String haystack = "a";
        String needle = "a";
        System.out.println(strStr.strStr(haystack, needle));
    }

    /**
     * 逐位分析
     *
     * @param haystack 干草堆
     * @param needle   针头
     * @return int
     */
    public int strStr(String haystack, String needle) {
        int lenS = haystack.length();
        char[] haystacks = haystack.toCharArray();
        int lenN = needle.length();
        char[] needles = needle.toCharArray();
        //lenS - lenN 减少循环次数
        for (int i = 0; i <= lenS - lenN; i++) {
            //父串需要的起始位
            int start = i;
            //匹配的从第一位开始
            int index = 0;
            //匹配每一位
            while(index < lenN && haystacks[start] == needles[index]){
                start++;
                index++;
            }
            // 如果能够完全匹配，返回原串的「发起点」下标
            if (lenN == index){
                return i;
            }
        }
        return -1;
    }

}
